package br.edu.ufcg.dsc.adsd.lotv.core.entites;

import eduni.simjava.Sim_system;
import eduni.simjava.distributions.Sim_negexp_obj;
import br.edu.ufcg.dsc.adsd.lotv.core.Connectable;
import br.edu.ufcg.dsc.adsd.lotv.core.LANPackage;
import br.edu.ufcg.dsc.adsd.lotv.utils.BigPrime;
import br.edu.ufcg.dsc.adsd.lotv.utils.Constants;


public class Source extends Connectable {
	
	private Sim_negexp_obj delay;

	public Source(String name, double mean) {
		super(name);
		// Utiliza uma semente para cada simulação, seguindo o que foi dito no
		// tópico 8.2 do tutorial (independent replications)
		this.delay = new Sim_negexp_obj(name + Constants.DISTRIBUTION_NAME, mean, BigPrime.getSeed());
		this.add_generator(this.delay);
	}
	
	//TODO: Definir o funcionamento do sistema em função de condições de parada
	// http://www.icsa.informatics.ed.ac.uk/research/groups/hase/simjava/guide/tutorial.html#7
	
	@Override
	public void body() {
		System.out.println("Source ID:" + this.get_id() + " - Ports: " + this.ports);
		this.sim_pause(10.0);
		
		//for(int i = 0; i < 10000; i++) {
		while (Sim_system.running()) {
			LANPackage pkg = new LANPackage(this.get_name(), null);
			pkg.valueOf(Constants.PACKAGE_TYPE, Constants.NEW_REQUEST);
			this.sim_schedule(this.gatewayPort, 0.0, Constants.UNICAST, pkg);
			this.sim_pause(this.delay.sample());
		}
	}

}
